home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / ui / profile.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  7KB  |  242 lines

  1. /* ********************************************************************** *\
  2.  *         Copyright IBM Corporation 1988,1991 - All Rights Reserved      *
  3. ############################################################################
  4. #        Copyright IBM Corporation 1988, 1991 - All Rights Reserved        #
  5. #                                                                          #
  6. # Permission to use, copy, modify, and distribute this software and its    #
  7. # documentation for any purpose and without fee is hereby granted,         #
  8. # provided that the above copyright notice appear in all copies and        #
  9. # that both that copyright notice and this permission notice appear in     #
  10. # supporting documentation, and that the name of IBM not be used in        #
  11. # advertising or publicity pertaining to distribution of the software      #
  12. # without specific, written prior permission.                              #
  13. #                                                                          #
  14. # IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL #
  15. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL IBM #
  16. # BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY      #
  17. # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER  #
  18. # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING   #
  19. # OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.    #
  20. ############################################################################
  21. \* ********************************************************************** */
  22. /* $Header: /afs/andrew.cmu.edu/itc/sm/releases/X.V11R5/ftp/src/overhead/util/lib/RCS/profile.c,v 2.11 1991/09/12 17:28:27 bobg Exp $ */
  23. /* $ACIS:profile.c 1.5$ */
  24. /* $Source: /afs/andrew.cmu.edu/itc/sm/releases/X.V11R5/ftp/src/overhead/util/lib/RCS/profile.c,v $ */
  25.  
  26. #ifndef lint
  27. static char *rcsid = "$Header: /afs/andrew.cmu.edu/itc/sm/releases/X.V11R5/ftp/src/overhead/util/lib/RCS/profile.c,v 2.11 1991/09/12 17:28:27 bobg Exp $";
  28. #endif /* lint */
  29.  
  30. #include <stdio.h>
  31. #include <sys/types.h>
  32. #include <sys/stat.h>
  33. #include <sys/param.h>
  34. #include <pwd.h>
  35. #include <ctype.h>
  36.  
  37. #include "config.h"
  38. #if 0
  39. #include <andrewos.h>        /* sys/types.h */
  40. #include <sys/stat.h>
  41. #include <sys/param.h>    /* For MAXPATHLEN */
  42. #include <pwd.h>
  43. #include <ctype.h>
  44. #include <util.h>
  45. #endif
  46.  
  47. #define DEFAULTPROFILES "~/preferences:~/.preferences:~/.Xdefaults"
  48. #define GLOBALPROFILE AndrewDir("/lib/global.prf")
  49.  
  50. static struct configurelist *profileHead = NULL;
  51. static struct configurelist *GloprofileHead = NULL;
  52.  
  53. static  int inited = 0;  /* Used to be static local to openprofile -- nsb */
  54. static char *profileFileName = NULL;
  55. static char *firstProfileFileName = NULL;
  56.  
  57. #define openglobalprofile() ((struct configurelist *) ReadConfigureFile(GLOBALPROFILE))
  58.  
  59. static struct configurelist *openprofile (filename, defaultname)
  60.     char *filename;
  61.     char *defaultname;
  62. {
  63.     char *pl=(char *) getenv(filename);
  64.     char *home=(char *) gethome(NULL);
  65.     char *sep;
  66.     int homelen=(home==NULL ? 0 : strlen(home));
  67.     struct configurelist *cl;
  68.     char tmpFileName[MAX_PATH_NAME_LEN];
  69.  
  70.     if(pl==NULL || *pl=='\0')
  71.         pl=defaultname;
  72.  
  73.     do{
  74.     char *name;
  75.     int namelen;
  76.  
  77.     sep=(char *)index(pl,':');
  78.  
  79.     name = pl;
  80.  
  81.     if(sep!=NULL){
  82.         namelen = sep - pl;
  83.         pl=sep+1;
  84.     }
  85.     else
  86.         namelen=strlen(name);
  87.  
  88.     if(*name=='~' && (name++,namelen--,homelen>0)){
  89.         strcpy(tmpFileName,home);
  90.         strncat(tmpFileName,name, namelen);
  91.         tmpFileName[namelen + homelen] = '\0';
  92.     }
  93.     else {
  94.         strncpy(tmpFileName,name, namelen);
  95.         tmpFileName[namelen] = '\0';
  96.     }
  97.  
  98.     if (firstProfileFileName == NULL)  {
  99.         firstProfileFileName = (char *) malloc(strlen(tmpFileName) + 1);
  100.         strcpy(firstProfileFileName, tmpFileName);
  101.     }
  102.  
  103.     if ((cl = (struct configurelist *) ReadConfigureFile(tmpFileName)) != NULL)  {
  104.         if (profileFileName != NULL)  {
  105.         free(profileFileName);
  106.         }
  107.         profileFileName = (char *) malloc(strlen(tmpFileName) + 1);
  108.         strcpy(profileFileName, tmpFileName);
  109.         return cl;
  110.     }
  111.  
  112.     } while(sep!=NULL);
  113.  
  114.     return NULL;
  115.  
  116. }
  117.  
  118. char *GetProfileFileName()
  119. {
  120.     if (! inited)  {
  121.     profileHead = openprofile("PROFILES", DEFAULTPROFILES);
  122.     GloprofileHead = openprofile("GLOBALPROFILES", GLOBALPROFILE);
  123.     inited = 1;
  124.     }
  125.  
  126.     return profileFileName;
  127. }
  128.  
  129. char *GetFirstProfileFileName()
  130. {
  131.     if (! inited)  {
  132.     profileHead = openprofile("PROFILES", DEFAULTPROFILES);
  133.     GloprofileHead = openprofile("GLOBALPROFILES", GLOBALPROFILE);
  134.     inited = 1;
  135.     }
  136.  
  137.     return firstProfileFileName;
  138. }
  139.  
  140. refreshprofile() {  /* Force rereading */
  141.     if (profileHead != NULL)  {
  142.     FreeConfigureList(profileHead);
  143.     profileHead = NULL;
  144.     }
  145.     if (profileFileName != NULL)  {
  146.     free(profileFileName);
  147.     profileFileName = NULL;
  148.     }
  149.     inited = 0;
  150. }
  151.  
  152. char *getprofile (var)
  153. char *var; {
  154.     char *retval;
  155.     if (! inited)  {
  156.     profileHead = openprofile("PROFILES", DEFAULTPROFILES);
  157.     GloprofileHead = openprofile("GLOBALPROFILES", GLOBALPROFILE);
  158.     inited = 1;
  159.     }
  160. #ifdef GLOBALPREFERENCE
  161. /* check for exact match in users profile */
  162.     if((retval = (char *) GetConfig(profileHead, var, 0)) != NULL)
  163.     return retval;
  164. /* check for exact match in global profile */
  165.     if((retval = (char *) GetConfig(GloprofileHead, var, 0)) != NULL)
  166.     return retval;
  167. #endif
  168. /* check for unexact match in users profile */
  169.     if((retval = (char *) GetConfig(profileHead, var, 1)) != NULL)
  170.     return retval;
  171. /* check for unexact match in global profile */
  172.     return (char *) GetConfig(GloprofileHead, var, 1) ;
  173. }
  174.  
  175. getprofileswitch (var, DefaultValue)
  176. char   *var; {
  177.     char   *val;
  178.     register    len;
  179.     static struct keys {
  180.     char   *name;
  181.     int     value;
  182.     }                   keys[] = {
  183.                         "true", 1,
  184.                         "false", 0,
  185.                         "on", 1,
  186.                         "off", 0,
  187.                         "yes", 1,
  188.                         "no", 0,
  189.                         "1", 1,
  190.                         "0", 0,
  191.                         0, 0
  192.     };
  193.     register struct keys   *p;
  194.     if (var && (val = getprofile (var))) {
  195.     len = strlen (val);
  196.     for (p = keys; p -> name; p++)
  197.         if (p -> name[0] == val[0] && strncmp (p -> name, val, len) == 0)  {
  198.         return p -> value;
  199.         }
  200.     }
  201.     return DefaultValue;
  202. }
  203.  
  204. getprofileint (var, DefaultValue)
  205. char   *var; {
  206.     register char  *val;
  207.     register    n = 0;
  208.     register    neg = 0;
  209.  
  210.     if (var == 0 || (val = getprofile(var)) == 0)  {
  211.     return DefaultValue;
  212.     }
  213.     while (*val) {
  214.     if (*val == '-')
  215.         neg = ~neg;
  216.     else
  217.         if (*val != ' ' && *val != '\t')
  218.         if ('0' <= *val && *val <= '9')
  219.             n = n * 10 + *val - '0';
  220.         else  {
  221.             return DefaultValue;
  222.         }
  223.     val++;
  224.     }
  225.     return neg ? -n : n;
  226. }
  227.  
  228. profileentryexists(var, usedefault)
  229.     char *var;
  230.     int usedefault;
  231. {
  232.  
  233.     if (! inited)  {
  234.     profileHead = openprofile("PROFILES", DEFAULTPROFILES);
  235.     GloprofileHead = openglobalprofile();
  236.     inited = 1;
  237.     }
  238.  
  239.     return (var != NULL && ( (GetConfig(profileHead, var, usedefault) != NULL) || 
  240.                  (GetConfig(GloprofileHead, var, usedefault) != NULL)));
  241. }
  242.